package Annotation;

import java.lang.annotation.Annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * 元注解: 标记注解使用 元标签有 @Retention、@Documented、@Target、@Inherited、@Repeatable 5 种
 * 1、@Retention 生命周期 RetentionPolicy.SOURCE 注解只在源码阶段保留，在编译器进行编译时它将被丢弃忽视
 * RetentionPolicy.CLASS 注解只被保留到编译进行的时候，它并不会被加载到 JVM 中 RetentionPolicy.RUNTIME
 * 注解可以保留到程序运行的时候，它会被加载进入到 JVM 中，所以在程序运行时可以获取到它们。 2、@Documented 作用是能够将注解中的元素包含到
 * Javadoc 中去 3、@Target 指定了注解运用的范围 ElementType.ANNOTATION_TYPE 可以给一个注解进行注解
 * ElementType.CONSTRUCTOR 可以给构造方法进行注解 ElementType.FIELD 可以给属性进行注解
 * ElementType.LOCAL_VARIABLE 可以给局部变量进行注解 ElementType.METHOD 可以给方法进行注解
 * ElementType.PACKAGE 可以给一个包进行注解 ElementType.PARAMETER 可以给一个方法内的参数进行注解
 * ElementType.TYPE 可以给一个类型进行注解，比如类、接口、枚举 4、@Inherited
 * 继承，它并不是说注解本身可以继承，而是说如果一个超类被 @Inherited
 * 注解过的注解进行注解的话，那么如果它的子类没有被任何注解应用的话，那么这个子类就继承了超类的注解 5、@Repeatable 可重复注解，可多个相同注解
 * 
 * 
 * Java 预置的注解: 1、@Deprecated 标记过时的元素 类似c# obsolete 2、@Override 重写父类中被 @Override
 * 修饰的方法 3、@SuppressWarnings 阻止(忽略)警告，调用被 @Deprecated
 * 注解的方法后，编译器会警告提醒，而有时候开发者会忽略这种警告，他们可以在调用的地方通过 @SuppressWarnings 达到目的
 * 4、@SafeVarargs 参数安全类型注解 5、@FunctionalInterface 函数式接口注解
 */

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CustomFieldAnnotation {

    // int id();
    // String msg();

    // 注解属性默认值
    public int id() default -1;

    public String msg() default "Hi";
}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@interface CustomClassAnnotation {
    public String value();
}